/****************************************Copyright (c)*************************
**                               版权所有 (C), 2015-2020, 涂鸦科技
**
**                                 http://www.tuya.com
**
**--------------文件信息-------------------------------------------------------
**文   件   名: mcu_api.h
**描        述: 下发/上报数据处理函数
**使 用 说 明 : 此文件下函数无须用户修改,用户需要调用的文件都在该文件内
**
**
**--------------当前版本修订---------------------------------------------------
** 版    本: v1.0.1
** 日　  期: 2020年2月26日
** 修改人员: 周猛
** 协议版本: v1.1.1
** 描　  述: 1:产品信息新增tp字段和p字段
             2:修改product_info_update函数，新增参数ver来选择是否支持获取产品pid
               将组包格式由JSON格式换成sprintf，以减轻MCU资源压力
             3:增加带传入帧版本的串口数据发送函数wifi_uart_write_frame_ver
             4:在wifi_uart_service函数中，取消了串口数据对帧版本的校验

** 版    本: v1.0.0
** 日　  期: 2019年7月27日
** 修改人员: 陈力恒
** 协议版本: v1.1.1
** 描　  述: 1:gateway通用协议mcu_sdk初版
**-----------------------------------------------------------------------------
******************************************************************************/

#ifndef __MCU_API_H_
#define __MCU_API_H_


#ifdef MCU_API_GLOBAL
  #define MCU_API_EXTERN
#else
  #define MCU_API_EXTERN   extern
#endif

/*****************************************************************************
函数名称 : hex_to_bcd
功能描述 : hex转bcd
输入参数 : Value_H:高字节/Value_L:低字节
返回参数 : bcd_value:转换完成后数据
*****************************************************************************/
unsigned char hex_to_bcd(unsigned char Value_H,unsigned char Value_L);
/*****************************************************************************
函数名称 : my_strlen
功能描述 : 求字符串长度
输入参数 :
返回参数 :
*****************************************************************************/
unsigned long my_strlen(unsigned char *str);

/*****************************************************************************
函数名称 : my_memset
功能描述 : 把src所指内存区域的前count个字节设置成字符c
输入参数 :
返回参数 :
*****************************************************************************/
void *my_memset(void *src,unsigned char ch,unsigned short count);

/*****************************************************************************
函数名称 : mymemcpy
功能描述 : 内存拷贝
输入参数 :
返回参数 :
*****************************************************************************/
void *my_memcpy(void *dest, const void *src, unsigned short count);
/*****************************************************************************

*****************************************************************************
函数名称 : my_strcpy
功能描述 : 内存拷贝
输入参数 : dest:目标地址
           src:源地址
返回参数 : 数据处理完后的源地址
*****************************************************************************/
char *my_strcpy(char *dest, const char *src);

/*****************************************************************************
函数名称 : my_strcmp
功能描述 : 内存拷贝
输入参数 : s1:字符串1
           s2:字符串2
返回参数 : 大小比较值，0:s1=s2; -1:s1<s2; 1:s1>s2
*****************************************************************************/
int my_strcmp(char *s1 , char *s2);

/*****************************************************************************
函数名称 : int_to_byte
功能描述 : 将int类型拆分四个字节
输入参数 : number:4字节原数据;value:处理完成后4字节数据
返回参数 :无
****************************************************************************/
void int_to_byte(unsigned long number,unsigned char value[4]);

/*****************************************************************************
函数名称 : byte_to_int
功能描述 : 将4字节合并为1个32bit变量
输入参数 : value:4字节数组
返回参数 : number:合并完成后的32bit变量
****************************************************************************/
unsigned long byte_to_int(const unsigned char value[4]);

#ifndef WIFI_CONTROL_SELF_MODE
/*****************************************************************************
函数名称 : mcu_get_reset_wifi_flag
功能描述 : MCU获取复位wifi成功标志
输入参数 : 无
返回参数 : 复位标志:RESET_WIFI_ERROR:失败/RESET_WIFI_SUCCESS:成功
使用说明 : 1:MCU主动调用mcu_reset_wifi()后调用该函数获取复位状态
           2:如果为模块自处理模式,MCU无须调用该函数
*****************************************************************************/
unsigned char mcu_get_reset_wifi_flag(void);
/*****************************************************************************
函数名称 : reset_wifi
功能描述 : MCU主动重置wifi工作模式
输入参数 : 无
返回参数 : 无
使用说明 : 1:MCU主动调用,通过mcu_get_reset_wifi_flag()函数获取重置wifi是否成功
           2:如果为模块自处理模式,MCU无须调用该函数
*****************************************************************************/
void mcu_reset_wifi(void);
/*****************************************************************************
函数名称 : mcu_get_wifimode_flag
功能描述 : 获取设置wifi状态成功标志
输入参数 : 无
返回参数 : SET_WIFICONFIG_ERROR:失败/SET_WIFICONFIG_SUCCESS:成功
使用说明 : 1:MCU主动调用mcu_set_wifi_mode()后调用该函数获取复位状态
           2:如果为模块自处理模式,MCU无须调用该函数
*****************************************************************************/
unsigned char mcu_get_wifimode_flag(void);
/*****************************************************************************
函数名称 : mcu_set_wifi_mode
功能描述 : MCU设置wifi工作模式
输入参数 : mode:
          SMART_CONFIG:进入smartconfig模式
          AP_CONFIG:进入AP模式
返回参数 : 无
使用说明 : 1:MCU主动调用
           2:成功后,可判断set_wifi_config_state是否为TRUE;TRUE表示为设置wifi工作模式成功
           3:如果为模块自处理模式,MCU无须调用该函数
*****************************************************************************/
void mcu_set_wifi_mode(unsigned char mode);
/*****************************************************************************
函数名称 : mcu_get_wifi_work_state
功能描述 : MCU主动获取当前wifi工作状态
输入参数 : 无
返回参数 : WIFI_WORK_SATE_E:
          SMART_CONFIG_STATE:smartconfig配置状态
          AP_STATE:AP 配置状态
          WIFI_NOT_CONNECTED:WIFI 配置成功但未连上路由器
          WIFI_CONNECTED:WIFI 配置成功且连上路由器
		  WIFI_CONN_CLOUD:WIFI 已经连接上云服务器
          WIFI_LOW_POWER:WIFI 处于低功耗模式
使用说明 : 无
*****************************************************************************/
unsigned char mcu_get_wifi_work_state(void);
#endif

#ifdef SUPPORT_GREEN_TIME
/*****************************************************************************
函数名称  : mcu_get_green_time
功能描述 : MCU获取格林时间
输入参数 : 无
返回参数 : 无
使用说明 :
*****************************************************************************/
void mcu_get_green_time(void);
#endif


#ifdef SUPPORT_MCU_RTC_CHECK
/*****************************************************************************
函数名称  : mcu_get_system_time
功能描述 : MCU获取系统时间,用于校对本地时钟
输入参数 : 无
返回参数 : 无
使用说明 : MCU主动调用完成后在mcu_write_rtctime函数内校对rtc时钟
*****************************************************************************/
void mcu_get_system_time(void);
#endif

/*****************************************************************************
函数名称  : BATCH_ADD_DEV
功能描述 : 批量添加子设备
输入参数 : cids:存放子设备id的集合
           num：子设备的个数
           pid:产品 ID（ProductID），涂鸦云创建产品时生产
           ver:版本号，例如"1.0.0"
返回参数 : 无
使用说明 :
*****************************************************************************/
void batch_add_dev(char *cids[],char num,char *pid,char *mcu_ver);

#ifdef WIFI_TEST_ENABLE
/*****************************************************************************
函数名称 : mcu_start_wifitest
功能描述 : mcu发起wifi功能测试
输入参数 : 无
返回参数 : 无
使用说明 : MCU需要自行调用该功能
*****************************************************************************/
void mcu_start_wifitest(void);
#endif

/*****************************************************************************
函数名称 : get_wifi_st
功能描述 : MCU可根据此条命令获取 WIFI 状态。
输入参数 : 无
返回参数 : 无
使用说明 : MCU需要自行调用该功能
*****************************************************************************/
void get_wifi_st(void);

/*****************************************************************************
函数名称 : reset_factory_setting
功能描述 : 恢复出厂设置（可选）
输入参数 : 无
返回参数 : 无
使用说明 : MCU需要自行调用该功能
*****************************************************************************/
void reset_factory_setting(void);

/*****************************************************************************
函数名称 : local_subdev_del_cmd
功能描述 : 本地删除子设备(MCU 发送删除子设备指令)
输入参数 : 无
返回参数 : 无
使用说明 : MCU需要自行调用该功能
*****************************************************************************/
void local_subdev_del_cmd(char *sub_id);

/*****************************************************************************
函数名称 : local_add_subdev_limit
功能描述 : 本地允许/关闭添加子设备
输入参数 : if_permit
                0：关闭子设备添加
                1：允许子设备添加
           addtime_high:允许添加时间（高字节）
           addtime_low: 允许添加时间（低字节）

返回参数 : 无
*****************************************************************************/
void local_add_subdev_limit(unsigned char if_permit,unsigned char addtime_high,unsigned char addtime_low);

/*****************************************************************************
函数名称 : get_module_remain_memory
功能描述 : 取 WIFI 模块剩余内存
输入参数 : 无
返回参数 : 无
使用说明 : MCU需要自行调用该功能
*****************************************************************************/
void get_module_remain_memory(void);

/*****************************************************************************
函数名称 : qur_subdev_list
功能描述 : 查询子设备列表
输入参数 : 无
返回参数 : 无
使用说明 : MCU需要自行调用该功能
*****************************************************************************/
void qur_subdev_list(void);

/*****************************************************************************
函数名称 : pull_sigmesh_newinfotm
功能描述 : 拉取 sig mesh 入网必需的网络信息
输入参数 : 无
返回参数 : 无
使用说明 : MCU需要自行调用该功能
*****************************************************************************/
void pull_sigmesh_newinfotm(void);

/*****************************************************************************
函数名称 : heart_beat_report
功能描述 : WIFI 模组定时（1-3 分钟）检测子设备在线状态，
           子设备必须回复心跳，连续两个周期不回复则认为子设备离线
输入参数 : sub_id:子设备标识，一般为mac地址，芯片id等，需要保证唯一性.不可以是”0000”.”0000”表示网关本身。
           hb_time:心跳间隔，单位：秒 (注意此处不是字符串，是数值)，0为不支持心跳，心跳小于
           30当作30s处理，大于30s（例如60，则心跳时间为60s）           
返回参数 : 无
使用说明 : MCU需要自行调用该功能
*****************************************************************************/
void heart_beat_report(unsigned char *sub_id_buf,unsigned char hb_time);

/*****************************************************************************
函数名称 : mcu_dp_raw_update
功能描述 : raw型dp数据上传
输入参数 : dpid:id号
           value:当前dp值指针
           len:数据长度
返回参数 : 无
*****************************************************************************/
unsigned char mcu_dp_raw_update(unsigned char dpid,const unsigned char value[],unsigned short len,unsigned char sub_id_len,unsigned char *sub_id_buf);

/*****************************************************************************
函数名称 : mcu_dp_bool_update
功能描述 : bool型dp数据上传
输入参数 : dpid:id号
           value:当前dp值
返回参数 : 无
*****************************************************************************/
unsigned char mcu_dp_bool_update(unsigned char dpid,unsigned char value,unsigned char sub_id_len,unsigned char *sub_id_buf);

/*****************************************************************************
函数名称 : mcu_dp_value_update
功能描述 : value型dp数据上传
输入参数 : dpid:id号
           value:当前dp值
返回参数 : 无
*****************************************************************************/
unsigned char mcu_dp_value_update(unsigned char dpid,unsigned long value,unsigned char sub_id_len,unsigned char *sub_id_buf);

/*****************************************************************************
函数名称 : mcu_dp_string_update
功能描述 : rstring型dp数据上传
输入参数 : dpid:id号
           value:当前dp值指针
           len:数据长度
返回参数 : 无
*****************************************************************************/
unsigned char mcu_dp_string_update(unsigned char dpid,const unsigned char value[],unsigned short len,unsigned char sub_id_len,unsigned char *sub_id_buf);

/*****************************************************************************
函数名称 : mcu_dp_enum_update
功能描述 : enum型dp数据上传
输入参数 : dpid:id号
           value:当前dp值
返回参数 : 无
*****************************************************************************/
unsigned char mcu_dp_enum_update(unsigned char dpid,unsigned char value,unsigned char sub_id_len,unsigned char *sub_id_buf);

/*****************************************************************************
函数名称 : mcu_dp_fault_update
功能描述 : fault型dp数据上传
输入参数 : dpid:id号
           value:当前dp值
返回参数 : 无
*****************************************************************************/
unsigned char mcu_dp_fault_update(unsigned char dpid,unsigned long value,unsigned char sub_id_len,unsigned char *sub_id_buf);

/*****************************************************************************
函数名称 : mcu_get_dp_download_bool
功能描述 : mcu获取bool型下发dp值
输入参数 : value:dp数据缓冲区地址
           length:dp数据长度
返回参数 : bool:当前dp值
*****************************************************************************/
unsigned char mcu_get_dp_download_bool(const unsigned char value[],unsigned short len);

/*****************************************************************************
函数名称 : mcu_get_dp_download_value
功能描述 : mcu获取value型下发dp值
输入参数 : value:dp数据缓冲区地址
           length:dp数据长度
返回参数 : value:当前dp值
*****************************************************************************/
unsigned long mcu_get_dp_download_value(const unsigned char value[],unsigned short len);

/*****************************************************************************
函数名称 : mcu_get_dp_download_enum
功能描述 : mcu获取enum型下发dp值
输入参数 : value:dp数据缓冲区地址
           length:dp数据长度
返回参数 : enum:当前dp值
*****************************************************************************/
unsigned char mcu_get_dp_download_enum(const unsigned char value[],unsigned short len);

/*****************************************************************************
函数名称 : uart_receive_input
功能描述 : 收数据处理
输入参数 : value:串口收到字节数据
返回参数 : 无
使用说明 : 在MCU串口处理函数中调用该函数,并将接收到的数据作为参数传入
*****************************************************************************/
void uart_receive_input(unsigned char value);

/*****************************************************************************
函数名称  : wifi_uart_service
功能描述  : wifi串口处理服务
输入参数 : 无
返回参数 : 无
使用说明 : 在MCU主函数while循环中调用该函数
*****************************************************************************/
void wifi_uart_service(void);

/*****************************************************************************
函数名称 :  wifi_protocol_init
功能描述 : 协议串口初始化函数
输入参数 : 无
返回参数 : 无
使用说明 : 在MCU初始化代码中调用该函数
*****************************************************************************/
void wifi_protocol_init(void);
/*****************************************************************************
函数名称 : uart_transmit_output
功能描述 : 发数据处理
输入参数 : value:串口收到字节数据
返回参数 : 无
使用说明 : 请将MCU串口发送函数填入该函数内,并将接收到的数据作为参数传入串口发送函数
*****************************************************************************/
void uart_transmit_output(unsigned char value);

/*****************************************************************************
函数名称 : gateway_subdevice_add
功能描述 : 1 MCU发送子设备入网请求给WIFI模块。
           2 pk_type 备用字段，不使用填0
输入参数 : mcu_ver：子设备的版本号
           pid:子设备的pid
           pk_type:用户自定义产品类型，可不传(填0代表不传)。
           sub_id_buf:子设备标识，一般为mac地址，芯片id等，需要保证唯一性.不可以是”0000”.”0000”表示网关本身。

返回参数 : 无
使用说明 : 注意：1 MCU需要自行调用该功能
*****************************************************************************/
void gateway_subdevice_add(unsigned char *mcu_ver,unsigned char *pid,unsigned char pk_type,unsigned char *sub_id_buf);

void update_subdev_online_status(unsigned char all, unsigned char status, unsigned char *sub_id_buf);


#endif
